package controller;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import model.Usuarios;
import java.util.ArrayList;
import java.sql.ResultSet;
import model.Empresas;
import model.Roles;
import model.UsuariosRoles;

public class UsuariosMgr extends DbManager {

    public static final UsuariosMgr mgr = new UsuariosMgr();

    public UsuariosMgr() {
        super("Usuarios");
        m_titles = new String[]{"cedula", "nombre", "clave", "telefono", "correo", "nitEmpresa"};
    }

    @Override
    protected Usuarios getBean() {
        return new Usuarios();
    }

    @Override
    protected void addObject(ArrayList v, ResultSet rs) {
        v.add(new Usuarios(rs));
    }

    @Override
    public synchronized Usuarios getItem(String id) {
        return (Usuarios) super.getItem(id);
    }

    public synchronized Usuarios getUsuario(String id){
        ArrayList<Usuarios> lst = executeQuery("select * from Usuarios where cedula like " + id);
        if (lst.size() > 0) {
            return lst.get(0);
        } else {
            return null;
        }
    }


    public synchronized Usuarios doLogin(String login, String passwd) {
        try {
            MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
            byte[] textbytes = passwd.getBytes();
            digest.update(textbytes);
            byte[] codigo = digest.digest();
            BigInteger bi = new BigInteger(1, codigo);

            String passwdmd5 = String.format("%0" + (codigo.length << 1) + "x", bi);
            ArrayList<Usuarios> lst = executeQuery("select * from Usuarios where cedula = '" + login + "' and clave = '" + passwdmd5 + "' limit 1;");
            if (lst.size() > 0) {
                return lst.get(0);
            } else {
                return null;
            }
        } catch (Exception e) {
            return null;
        }

      
    }

    public synchronized boolean usuarioAdmin(String doc){
        Roles r=getRol(doc);
        if(r.permisos.equals("1")){return true;}
        else {return false;}
    }

    public synchronized Roles getRol (String doc){
        ArrayList <UsuariosRoles> ur = executeQuery("SELECT * FROM UsuariosRoles U where cedulaUsuario = "+doc);
        RolesMgr rmgr = new RolesMgr();
        Roles r = rmgr.getItem(ur.get(0).id);
        return r;
    }

    public synchronized Empresas EmpresaDeUsuario (String doc){
        ArrayList<Empresas> misEmpresas = executeQuery("SELECT * FROM Usuarios U where nitEmpresa like "+doc);
        return misEmpresas.get(0);
    }

    public synchronized Usuarios getSuperAdmin (String idEmpresa){
        String consultaAdmin = "SELECT u.* FROM Usuarios u, UsuariosRoles ur, Roles r where r.permisos = 1 and r.nitEmpresa = '"+idEmpresa+"' and ur.rolUsuario = r.idRol and u.cedula = ur.cedulaUsuario";
        ArrayList<Usuarios> lst = executeQuery(consultaAdmin);
        if (lst.size()>0){
            return lst.get(0);
        }else{
            return new Usuarios();
        }
    }

    public synchronized ArrayList<Usuarios> getListForEmpresa(String idEmpresa){
        ArrayList<Usuarios> lst = executeQuery("select * from Usuarios where nitEmpresa = '"+idEmpresa+"'");
        return lst;
    }

    public synchronized void eliminarUsuario(String id){
        execute("delete from UsuariosRoles where cedulaUsuario = '"+id+"'");
        execute("delete from Usuarios where cedula = '"+id+"'");
    }

    public synchronized void cambiarClave(String id, String clave){
        String sqlClave = "update Usuarios set clave = md5('"+clave+"') where cedula = '"+id+"'";
        execute(sqlClave);
    }

    public synchronized Usuarios getItemForCedula (String cedula){
        ArrayList<Usuarios> lst = executeQuery("select * from Usuarios where cedula = '"+cedula+"'");
        if (lst.size()>0){
            return lst.get(0);
        }else{
            return new Usuarios();
        }
    }

    public synchronized void actualizarUsuario (Usuarios data){
        execute(data.getUpdateSql2());
    }
}
